﻿#pragma once
#include <string>
#include <vector>
#include <iomanip>
#include "TimeSys.h"

// RINEX星历文件头结构
struct RinexHead {
    string version;         // 文件版本（如"3.02"）
    string creatingProgram; // 生成程序
    string creatingAgency;  // 生成机构
    string creationDate;    // 创建时间
    int leapSeconds;        // 闰秒数
    double ionAlpha[4];     // 电离层参数Alpha
    double ionBeta[4];      // 电离层参数Beta
};

// 广播星历数据结构
struct BroadEphemeris {
    string prn;             // 卫星PRN号（如"C01"）
    int year, month, day;   // 历元日期
    int hour, min;          // 历元时间（时/分）
    double sec;             // 历元秒数
    double clockBias;       // 钟差
    double clockDrift;      // 钟速
    double clockDriftRate;  // 钟漂
    vector<double> params;  // 15个轨道参数
};

// RINEX N文件（星历）读取解析类
class ReadN {
public:
    ReadN();                    // 默认构造
    explicit ReadN(string filePath); // 带文件路径构造

    // 接口函数
    bool set_file(string filePath);     // 设置文件路径
    bool parseFile();                   // 解析文件内容
    RinexHead& get_head();              // 获取文件头引用
    // 根据卫星PRN和时间获取星历
    BroadEphemeris* getEphemeris(string prn, BaseT time);
    bool print_eph();                   // 打印星历数据

private:
    string filePath;                   // 文件路径
    RinexHead header;                  // 文件头数据
    vector<BroadEphemeris> ListBroadEph; // 星历数据列表

    // 解析工具函数
    void parseHeaderLine(string& line); // 解析头文件行
    BroadEphemeris parseEpochLine(string& line); // 解析历元行
    void parseDataLine(string& line, BroadEphemeris& eph); // 解析数据行
};